﻿// D. Array Painting.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

/*
https://codeforces.com/problemset/problem/1849/D

给你一个由 n 个整数组成的数组，其中每个整数要么是 0，要么是 1，要么是 2。最初，数组中的每个元素都是蓝色的。

您的目标是将数组中的每个元素涂成红色。为此，您可以执行两种操作：

花费一枚硬币选择一个蓝色元素并将其涂成红色；选择一个不等于 0  ，将所选的红色元素减少 1，并将所选的蓝色元素涂成红色。

输入
第一行包含一个整数 n（1≤n≤2⋅105）。

第二行包含 n 个整数 a1,a2,...,an（0≤ai≤2）。

输出
打印一个整数 - 将所有元素涂成红色所需的最少硬币数。


Examples
InputCopy
3
0 2 0
OutputCopy
1
InputCopy
4
0 0 1 1
OutputCopy
2
InputCopy
7
0 1 0 0 1 0 2
OutputCopy
4




注释
在第一个例子中，只需花费一枚硬币，就可以将所有元素涂成红色，如下所示：
用一枚硬币将第 2 个元素涂成红色；将第 2 个元素减少 1，然后将第 1 个元素涂成红色；
将第 2 个元素减少 1 个，将第 3 个元素涂成红色。
在第二个例子中，只需花费两个硬币，就可以将所有元素涂成红色，如下所示：
用一枚硬币将第 4 个元素涂成红色；
减少第 4 个元素 1 个，将第 3 个元素涂成红色；减少第 3 个元素 1 个，将第 1 个元素涂成红色；减少第 3 个元素 1 个，将第 2 个元素涂成红色。
*/


#include <iostream>
#include <algorithm>

using namespace std;

const int N = 200010;
int a[N];
int color[N];
int n, ans;

int cp[N];
int cpColor[N];



void click2(int x) {
	color[x] = 1;
	int i = x;
	while (i > 1 && color[i - 1] == 0) {
		a[i]--;i--;
		color[i] = 1;
		if (a[i] == 0) break;
	}

	i = x; 
	while (i < n  && color[i + 1] == 0) {
		a[i]--; i++;
		color[i] = 1;
		if (a[i] == 0) break;
	}

	return;
}




int main()
{
	cin >> n;
	for (int i = 1; i <= n; i++) cin >> a[i];
	 
	for (int i = 1; i <= n; i++) {
		if (a[i] == 2 && color[i]==0) {
			ans++;
			click2(i);
		}
	}

	//超找连续未填颜色的1  看看能否填充左右的某一个
	for (int i = 1; i <= n; i++) {
		if (a[i] == 1 && color[i] == 0) {
			int l = i; 
			while (i <= n && a[i] == 1 && color[i] == 0) {
				color[i] = 1; a[i]--;
				i++;
			}
			i--;
			int r = i;
			if ((l - 1) >= 1 && a[l - 1] == 0 && color[l - 1] == 0) {
				color[l - 1] = 1;
			}
			else if (r + 1 <= n && a[r + 1] == 0 && color[r + 1] == 0) {
				color[r + 1] = 1;
			}
			ans++;
		}
	}
	
	for (int i = 1; i <= n; i++) {
		if (color[i] == 0) ans++;
	}

	cout << ans << endl;


	return 0;
}
 